from ultralytics import YOLO
from threading import Thread
from PIL import Image

def thread_safe_predict(image_path):
    # Instantiate a new model inside the thread
    local_model = YOLO("yolov8n.pt")
    results = local_model.predict(image_path)

    # cpu()         方法              将对象移至CPU    内存。
    # numpy()       方法              将对象转换为 numpy数组。
    # cuda()        方法              将对象移至    CUDA    内存。
    # to()          方法              将对象移动到指定设备。
    # conf          财产(torch.Tensor)    返回方框的置信度值。
    # cls           财产(torch.Tensor)    返回方框的类值。
    # id            财产(torch.Tensor)    返回盒子的轨道ID（如果有）。
    # xyxy          财产(torch.Tensor)    以xyxy 格式返回水平方框。
    # xywhr         财产(torch.Tensor)    以xywhr 格式返回旋转后的方框。
    # xyxyxyxy      财产(torch.Tensor)    以xyxyxyxy 格式返回旋转后的方框。
    # xyxyxyxyn     财产(torch.Tensor)    以xyxyxyxy 格式返回按图像大小归一化的旋转方框
    for r in results:
        im_array = r.plot()  # plot a BGR numpy array of predictions
        im = Image.fromarray(im_array[..., ::-1])  # RGB PIL image
        im.show()  # show image
        im.save('results.jpg')  # save image
    # Process results


# Starting threads that each have their own model instance
Thread(target=thread_safe_predict, args=("image1.jpg",)).start()
Thread(target=thread_safe_predict, args=("image2.jpg",)).start()